from PySide6.QtWidgets import QGraphicsPathItem
from PySide6.QtCore import QPointF
from PySide6.QtGui import QPen, QPainterPath, QColor


class ConnectionItem(QGraphicsPathItem):
    def __init__(self, startPort, endPort):
        super().__init__()
        self.startPort = startPort
        self.endPort = endPort

        # 验证连接
        if not self.validateConnection():
            return

        # 添加到端口
        if not self.addToPorts():
            return

        # 设置样式
        self.setupStyle()
        self.updatePath()

    def validateConnection(self):
        """验证连接是否有效"""
        # 检查端口是否存在
        if not self.startPort or not self.endPort:
            print("错误: 端口不存在")
            return False

        # 检查端口是否属于同一个节点
        if self.startPort.parentNode == self.endPort.parentNode:
            print("错误: 不能连接到同一个节点")
            return False

        # 检查连接方向是否正确（输出->输入）
        if self.startPort.isInput or not self.endPort.isInput:
            print("错误: 连接方向错误 - 必须从输出端口连接到输入端口")
            return False

        # 检查输入端口是否已经有连接
        if not self.endPort.canAcceptConnection():
            print(f"错误: 输入端口 {self.endPort.portName} 已有连接")
            return False

        return True

    def addToPorts(self):
        """将连接添加到端口"""
        try:
            # 添加到输出端口
            if hasattr(self.startPort, 'addConnection'):
                if not self.startPort.addConnection(self):
                    print(f"错误: 无法添加到输出端口 {self.startPort.portName}")
                    return False

            # 添加到输入端口
            if hasattr(self.endPort, 'addConnection'):
                if not self.endPort.addConnection(self):
                    print(f"错误: 无法添加到输入端口 {self.endPort.portName}")
                    # 如果无法添加到输入端口，也从输出端口移除
                    if hasattr(self.startPort, 'removeConnection'):
                        self.startPort.removeConnection(self)
                    return False

            return True
        except Exception as e:
            print(f"错误: 添加到端口时出错 - {e}")
            return False

    def setupStyle(self):
        """设置连接样式"""
        # 连接线颜色为黄色
        self.connectionColor = QColor(200, 200, 100)
        self.setPen(QPen(self.connectionColor, 2))

    def updatePath(self):
        """更新连接路径"""
        try:
            path = QPainterPath()

            # 获取端口场景位置
            startPos = self.startPort.scenePos()
            endPos = self.endPort.scenePos()

            # 创建贝塞尔曲线路径
            path.moveTo(startPos)

            # 计算控制点
            dx = (endPos.x() - startPos.x()) * 0.5
            control1 = QPointF(startPos.x() + dx, startPos.y())
            control2 = QPointF(endPos.x() - dx, endPos.y())

            path.cubicTo(control1, control2, endPos)
            self.setPath(path)
        except Exception as e:
            print(f"错误: 更新连接路径时出错 - {e}")

    def getSerializationData(self):
        """获取连接序列化数据"""
        return {
            'startNodeId': self.startPort.parentNode.nodeId,
            'startPortName': self.startPort.portName,
            'endNodeId': self.endPort.parentNode.nodeId,
            'endPortName': self.endPort.portName
        }

    def delete(self):
        """删除连接"""
        try:
            if hasattr(self.startPort, 'removeConnection'):
                self.startPort.removeConnection(self)
            if hasattr(self.endPort, 'removeConnection'):
                self.endPort.removeConnection(self)
            if self.scene():
                self.scene().removeItem(self)
        except Exception as e:
            print(f"错误: 删除连接时出错 - {e}")